﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using WebServiceDSDG6.Persistencia;
using RRTWSEntityDSD.Dominio;
using System.Data.SqlClient;
using System.Data;

namespace RRTWSEntityDSD.Dao
{
    public class EventoDAO : BaseDAO<EventoDeportivo, int>
    {
        public RRTWSEntityDSD.Dominio.EventoDeportivo crear(string feIni,
            string feFin,
            string descripcion,
            string idContenidoWeb,
            int limiteEnt,
            int estadio,
            double precio,
            string uuidContenido)
        {
            EventoDeportivo e = new EventoDeportivo()
            {
                precioEntrada = precio,
                limiteEntradas = limiteEnt,
                fechaInicio = feIni,
                fechaFinEvent = feFin,
                idEstadio = estadio,
                uuidContenido = uuidContenido,
                descripcion = descripcion,
                fechaRegistro = DateTime.Now.ToString()
            };

            return Crear(e);
        }

        public RRTWSEntityDSD.Dominio.EventoDeportivo getEvento(int id)
        {
            return Obtener(id);
        }

        public RRTWSEntityDSD.Dominio.EventoDeportivo getEvento(string idContenidoWeb)
        {
            try
            {
                string query = " select top 1 * from dbo.EVENTO_DEPORTIVO where EST_ID_CONTENIDO = " + idContenidoWeb;

                SqlCommand cmd = new SqlCommand(query, cnx);
                cnx.Open();
                using (SqlDataReader dr = cmd.ExecuteReader())
                {
                    while (dr.Read())
                    {
                        if (!Convert.IsDBNull(dr["EVE_ID_EVE_DEPORTIVO"]))
                        {
                            EventoDeportivo e = new EventoDeportivo()
                            {
                                idEvento = int.Parse(dr["EVE_ID_EVE_DEPORTIVO"].ToString()),
                                precioEntrada = double.Parse(dr["EVE_PRECIO"].ToString()),
                                limiteEntradas = int.Parse(dr["EVE_CANTIDAD_ENTRADAS"].ToString()),
                                fechaInicio = dr["EVE_FECHA_HORA_INICIO"].ToString(),
                                fechaFinEvent = dr["EVE_FECHA_HORA_FIN"].ToString(),
                                idEstadio = int.Parse(dr["EST_ID_ESTADIO"].ToString()),
                                uuidContenido = dr["EST_ID_CONTENIDO"].ToString(),
                                descripcion = dr["EVE_DESCRIPCION"].ToString(),
                                fechaRegistro = dr["EVE_FECHA_REGISTRO"].ToString()
                            };
                            return e;
                        }
                    }
                }
            }
            catch (Exception e)
            {
                throw new InvalidOperationException("Error de conexiones  ");
            }

            finally
            {
                cnx.Close();
            }
            return null;
        }


        public List<RRTWSEntityDSD.Dominio.EventoDeportivo> getListarUltimosEventos(int limite)
        {
            try
            {
                string query = " select top " + limite +
                            " [EVE_ID_EVE_DEPORTIVO] " +
                            " ,[EVE_FECHA_HORA_INICIO] " +
                            " ,[EVE_FECHA_HORA_FIN] " +
                            " ,[EVE_DESCRIPCION] " +
                            " ,[EST_ID_ESTADIO] " +
                            " ,[EST_ID_CONTENIDO] " +
                            " ,(EVE_CANTIDAD_ENTRADAS - (  select COUNT(*) from ENTRADA entra where entra.EVE_ID_EVENTO=EVE_ID_EVE_DEPORTIVO)) as EVE_CANTIDAD_ENTRADAS " +
                            " ,[EVE_PRECIO] " +
                            " ,[EVE_FECHA_REGISTRO]  from dbo.EVENTO_DEPORTIVO   order by CONVERT(Datetime, EVE_FECHA_REGISTRO , 120)  DESC";

                SqlCommand cmd = new SqlCommand(query, cnx);
                cnx.Open();
                using (SqlDataReader dr = cmd.ExecuteReader())
                {
                    List<EventoDeportivo> listaEventos = new List<EventoDeportivo>();
                    EventoDeportivo e;
                    while (dr.Read())
                    {
                        if (!Convert.IsDBNull(dr["EVE_ID_EVE_DEPORTIVO"]))
                        {
                            e = new EventoDeportivo()
                            {
                                idEvento = int.Parse(dr["EVE_ID_EVE_DEPORTIVO"].ToString()),
                                precioEntrada = double.Parse(dr["EVE_PRECIO"].ToString()),
                                limiteEntradas = int.Parse(dr["EVE_CANTIDAD_ENTRADAS"].ToString()),
                                fechaInicio = dr["EVE_FECHA_HORA_INICIO"].ToString(),
                                fechaFinEvent = dr["EVE_FECHA_HORA_FIN"].ToString(),
                                idEstadio = int.Parse(dr["EST_ID_ESTADIO"].ToString()),
                                uuidContenido = dr["EST_ID_CONTENIDO"].ToString(),
                                descripcion = dr["EVE_DESCRIPCION"].ToString(),
                                fechaRegistro = dr["EVE_FECHA_REGISTRO"].ToString()
                            };
                            listaEventos.Add(e);
                        }
                    }
                    return listaEventos;
                }
            }
            catch (Exception e)
            {

                throw new InvalidOperationException("Error de conexiones :" + e.Message);
            }

            finally
            {
                cnx.Close();
            }
            return null;
        }

        public RRTWSEntityDSD.Dominio.EventoDeportivo update(int evento, string feIni,
            string feFin,
            string descripcion,
            string idContenidoWeb,
            int limiteEnt,
            int estadio,
            double precio,
            string uuidContenido)
        {

            EventoDeportivo e = new EventoDeportivo()
            {
                idEvento = evento,
                precioEntrada = precio,
                limiteEntradas = limiteEnt,
                fechaInicio = feIni,
                fechaFinEvent = feFin,
                idEstadio = estadio,
                uuidContenido = uuidContenido,
                descripcion = descripcion
            };

            return Modificar(e);
        }



        public int countEventosFiltrado(
           string codigoubigeo, string estadio, string fechaEventoIncio, string fechaEventoFin, string descripcion)
        {
            try
            {
                string query = " SELECT COUNT(*) as cantidad " +
                                " FROM EVENTO_DEPORTIVO evento" +
                                "  where  evento.EVE_PRECIO >0  ";
                if ((codigoubigeo != null) && !(codigoubigeo.Equals("")))
                {
                    query += " AND evento.EST_ID_ESTADIO in " +
                         " (select EST_ID_ESTADIO from ESTADIO where UBIG_IDUBIGEO in (" +
                         " select UBIG_IDUBIGEO from T_UBIGEO where UBIG_CODIGO = '" + codigoubigeo + "'))  ";

                    if ((estadio != null) && !(estadio.Equals("")))
                    {
                        query += " AND" +
                                        " evento.EST_ID_ESTADIO = " + estadio;
                    }
                }


                if ((fechaEventoIncio != null) && !(fechaEventoIncio.Equals("")) && (fechaEventoFin != null) && !(fechaEventoFin.Equals("")))
                {
                    query += " AND CONVERT(Datetime,evento.EVE_FECHA_HORA_INICIO  , 120)  between CONVERT(Datetime, '" + fechaEventoIncio + "', 120) " +
                                   " and CONVERT(Datetime, '" + fechaEventoFin + "', 120) ";
                }
                if ((descripcion != null) && !(descripcion.Equals("")))
                {
                    query += " AND" +
                                   " evento.EVE_DESCRIPCION like '%" + descripcion + "%'";
                }

                SqlCommand cmd = new SqlCommand(query, cnx);
                cnx.Open();
                using (SqlDataReader dr = cmd.ExecuteReader())
                {
                    while (dr.Read())
                    {
                        if (!Convert.IsDBNull(dr["cantidad"]))
                        {
                            int e = int.Parse(dr["cantidad"].ToString());
                            return e;
                        }
                    }
                }
            }
            catch (Exception e)
            {
                throw new InvalidOperationException("Error de conexiones  " + e);
            }

            finally
            {
                cnx.Close();
            }
            return 0;
        }

        public List<RRTWSEntityDSD.Dominio.EventoDeportivo> getListarEventosFiltrado(int inicio, int fin, string codigoubigeo, string estadio, string fechaEventoIncio, string fechaEventoFin, string descripcion)
        {
            try
            {
                string query = " SELECT * FROM ( ";

                query += " SELECT [EVE_ID_EVE_DEPORTIVO] " +
                           " ,[EVE_FECHA_HORA_INICIO] " +
                           " ,[EVE_FECHA_HORA_FIN] " +
                           " ,[EVE_DESCRIPCION] " +
                           " ,[EST_ID_ESTADIO] " +
                           " ,[EST_ID_CONTENIDO] " +
                           " ,(evento.EVE_CANTIDAD_ENTRADAS - (  select COUNT(*) from ENTRADA entra where entra.EVE_ID_EVENTO=evento.EVE_ID_EVE_DEPORTIVO)) as EVE_CANTIDAD_ENTRADAS " +
                           " ,[EVE_PRECIO] " +
                           " ,[EVE_FECHA_REGISTRO] , ROW_NUMBER() OVER (ORDER BY EVE_ID_EVE_DEPORTIVO) AS RowNum  " +
                           " FROM EVENTO_DEPORTIVO evento" +
                           "  where  evento.EVE_PRECIO >0  ";

                if ((codigoubigeo != null) && !(codigoubigeo.Equals("")))
                {
                    query += " AND evento.EST_ID_ESTADIO in " +
                         " (select EST_ID_ESTADIO from ESTADIO where UBIG_IDUBIGEO in (" +
                         " select UBIG_IDUBIGEO from T_UBIGEO where UBIG_CODIGO = '" + codigoubigeo + "'))  ";
                    if ((estadio != null) && !(estadio.Equals("")))
                    {
                        query += " AND" +
                                        " evento.EST_ID_ESTADIO = " + estadio;
                    }
                }

                if ((fechaEventoIncio != null) && !(fechaEventoIncio.Equals("")) && (fechaEventoFin != null) && !(fechaEventoFin.Equals("")))
                {
                    query += " AND CONVERT(Datetime,evento.EVE_FECHA_HORA_INICIO  , 120)  between CONVERT(Datetime, '" + fechaEventoIncio + "', 120) " +
                                   " and CONVERT(Datetime, '" + fechaEventoFin + "', 120) ";
                }
                if ((descripcion != null) && !(descripcion.Equals("")))
                {
                    query += " AND" +
                                   " evento.EVE_DESCRIPCION like '%" + descripcion + "%' ";
                }



                query += " ) AS MyDerivedTable	WHERE MyDerivedTable.RowNum BETWEEN " + inicio + " AND " + fin + " ORDER BY CONVERT(Datetime, EVE_FECHA_REGISTRO , 120)  DESC ";


                SqlCommand cmd = new SqlCommand(query, cnx);
                cnx.Open();
                using (SqlDataReader dr = cmd.ExecuteReader())
                {
                    List<EventoDeportivo> listaEventos = new List<EventoDeportivo>();
                    EventoDeportivo e;
                    while (dr.Read())
                    {
                        if (!Convert.IsDBNull(dr["EVE_ID_EVE_DEPORTIVO"]))
                        {
                            e = new EventoDeportivo()
                            {
                                idEvento = int.Parse(dr["EVE_ID_EVE_DEPORTIVO"].ToString()),
                                precioEntrada = double.Parse(dr["EVE_PRECIO"].ToString()),
                                limiteEntradas = int.Parse(dr["EVE_CANTIDAD_ENTRADAS"].ToString()),
                                fechaInicio = dr["EVE_FECHA_HORA_INICIO"].ToString(),
                                fechaFinEvent = dr["EVE_FECHA_HORA_FIN"].ToString(),
                                idEstadio = int.Parse(dr["EST_ID_ESTADIO"].ToString()),
                                uuidContenido = dr["EST_ID_CONTENIDO"].ToString(),
                                descripcion = dr["EVE_DESCRIPCION"].ToString(),
                                fechaRegistro = dr["EVE_FECHA_REGISTRO"].ToString()
                            };
                            listaEventos.Add(e);
                        }
                    }
                    return listaEventos;
                }
            }
            catch (Exception e)
            {
                throw new InvalidOperationException("Error de conexiones  " + e);
            }

            finally
            {
                cnx.Close();
            }
            return null;
        }




        public void registrarEquiposAlEvento(int p, int equipo01, int equipo02)
        {
            try
            {
                using (SqlCommand cmd = new SqlCommand("TRI_ssf_crear_Evento_Equipos", cnx))
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@EVE_ID_EVE_DEPORTIVO", p);
                    cmd.Parameters.AddWithValue("@EVE_ID_EQUIPO_UNO", equipo01);
                    cmd.Parameters.AddWithValue("@EVE_ID_EQUIPO_DOS", equipo02);
                    cnx.Open();
                    SqlDataReader dr = cmd.ExecuteReader();
                }
            }
            catch (InvalidOperationException e)
            {
                throw new InvalidOperationException("Error de conexiones : " + e.Message);
            }
            finally
            {
                cnx.Close();
            }

        }

        public void modificarEquiposAlEvento(int p, int equipo01, int equipo02)
        {
            try
            {
                using (SqlCommand cmd = new SqlCommand("TRI_ssf_modificar_Evento_Equipos", cnx))
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@EVE_ID_EVE_DEPORTIVO", p);
                    cmd.Parameters.AddWithValue("@EVE_ID_EQUIPO_UNO", equipo01);
                    cmd.Parameters.AddWithValue("@EVE_ID_EQUIPO_DOS", equipo02);
                    cnx.Open();
                    SqlDataReader dr = cmd.ExecuteReader();
                }
            }
            catch (InvalidOperationException e)
            {
                throw new InvalidOperationException("Error de conexiones : " + e.Message);
            }
            finally
            {
                cnx.Close();
            }

        }

        public int cantidadEntradasCompradasPorClientePorEvento(int cliente, int evento)
        {
            try
            {
                string query = " SELECT count(*) as cantidad FROM ENTRADA " +
                                 " WHERE " +
                                 " OPE_ID_OPERACION IN (SELECT OPE_ID_OPERACION FROM OPERACION_LINEA  " +
                                 " WHERE  " +
                                 " CLI_ID_CLIENTE = " + cliente + ") " +
                                 " AND " +
                                 " EVE_ID_EVENTO = " + evento;

                SqlCommand cmd = new SqlCommand(query, cnx);
                cnx.Open();
                using (SqlDataReader dr = cmd.ExecuteReader())
                {
                    while (dr.Read())
                    {
                        if (!Convert.IsDBNull(dr["cantidad"]))
                        {
                            int e = int.Parse(dr["cantidad"].ToString());
                            return e;
                        }
                    }
                }
            }
            catch (Exception e)
            {
                throw new InvalidOperationException("Error de conexiones  ");
            }

            finally
            {
                cnx.Close();
            }
            return 0;
        }

        
        /// <summary>
        /// Obtiene el evento por intermedio de la operacion asociada a una entrada
        /// </summary>
        /// <param name="idOperacion">Se manda el idOperacion a la tabla de entrada</param>
        /// <returns></returns>
    
        public EventoDeportivo getEventoxOperacion(int idOperacion)
        {
            
            try
            {
//                string query = "SELECT TOP 1 ED.EVE_ID_EVE_DEPORTIVO"
//+",ED.EVE_FECHA_HORA_INICIO,ED.EVE_FECHA_HORA_FIN,ED.EVE_DESCRIPCION"
//+",ED.EST_ID_ESTADIO,ED.EST_ID_CONTENIDO,ED.EVE_CANTIDAD_ENTRADAS"
//+",ED.EVE_PRECIO,ED.EVE_FECHA_REGISTRO "
//+"FROM dbo.ENTRADA E"
//+"INNER JOIN dbo.EVENTO_DEPORTIVO ED"
//+"ON ED.EVE_ID_EVE_DEPORTIVO=E.EVE_ID_EVENTO"
//+"WHERE OPE_ID_OPERACION=" + idOperacion;

                SqlCommand cmd = new SqlCommand("TRI_ssf_EventoxOperacion", cnx);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@OPE_ID_OPERACION", idOperacion);
                cnx.Open();
                using (SqlDataReader dr = cmd.ExecuteReader())
                {
                    while (dr.Read())
                    {
                        if (!Convert.IsDBNull(dr["EVE_ID_EVE_DEPORTIVO"]))
                        {
                            EventoDeportivo e = new EventoDeportivo()
                            {
                                idEvento = int.Parse(dr["EVE_ID_EVE_DEPORTIVO"].ToString()),
                                precioEntrada = double.Parse(dr["EVE_PRECIO"].ToString()),
                                limiteEntradas = int.Parse(dr["EVE_CANTIDAD_ENTRADAS"].ToString()),
                                fechaInicio = dr["EVE_FECHA_HORA_INICIO"].ToString(),
                                fechaFinEvent = dr["EVE_FECHA_HORA_FIN"].ToString(),
                                idEstadio = int.Parse(dr["EST_ID_ESTADIO"].ToString()),
                                uuidContenido = dr["EST_ID_CONTENIDO"].ToString(),
                                descripcion = dr["EVE_DESCRIPCION"].ToString(),
                                fechaRegistro = dr["EVE_FECHA_REGISTRO"].ToString()
                            };
                            return e;
                        }
                    }
                }
            }
            catch (Exception e)
            {
                throw new InvalidOperationException("Error de conexiones  ");
            }

            finally
            {
                cnx.Close();
            }
            return null;
        }



    }
}